package com.zenithmind.common.utils;

import java.io.InputStream;
import java.util.List;

/**
 * 文件操作服务接口
 * 遵循依赖倒置原则：依赖抽象而非具体实现
 * 遵循接口隔离原则：只包含文件操作相关的功能
 */
public interface FileOperationService {
    
    /**
     * 上传文件
     * 
     * @param inputStream 文件输入流
     * @param fileName 文件名
     * @param contentType 文件类型
     * @return 文件访问URL
     */
    String uploadFile(InputStream inputStream, String fileName, String contentType);
    
    /**
     * 删除文件
     * 
     * @param fileUrl 文件URL
     * @return 是否删除成功
     */
    boolean deleteFile(String fileUrl);
    
    /**
     * 获取文件信息
     * 
     * @param fileUrl 文件URL
     * @return 文件信息
     */
    FileInfo getFileInfo(String fileUrl);
    
    /**
     * 批量上传文件
     * 
     * @param files 文件列表
     * @return 文件URL列表
     */
    List<String> uploadFiles(List<FileUploadRequest> files);
    
    /**
     * 批量删除文件
     * 
     * @param fileUrls 文件URL列表
     * @return 删除结果
     */
    BatchDeleteResult deleteFiles(List<String> fileUrls);
    
    /**
     * 检查文件是否存在
     * 
     * @param fileUrl 文件URL
     * @return 是否存在
     */
    boolean fileExists(String fileUrl);
    
    /**
     * 获取文件下载链接
     * 
     * @param fileUrl 文件URL
     * @param expireSeconds 过期时间（秒）
     * @return 下载链接
     */
    String getDownloadUrl(String fileUrl, long expireSeconds);
    
    /**
     * 文件上传请求
     */
    class FileUploadRequest {
        private InputStream inputStream;
        private String fileName;
        private String contentType;
        
        public FileUploadRequest(InputStream inputStream, String fileName, String contentType) {
            this.inputStream = inputStream;
            this.fileName = fileName;
            this.contentType = contentType;
        }
        
        // Getters
        public InputStream getInputStream() { return inputStream; }
        public String getFileName() { return fileName; }
        public String getContentType() { return contentType; }
    }
    
    /**
     * 文件信息
     */
    class FileInfo {
        private String fileName;
        private String contentType;
        private long size;
        private java.time.LocalDateTime uploadTime;
        
        public FileInfo(String fileName, String contentType, long size, java.time.LocalDateTime uploadTime) {
            this.fileName = fileName;
            this.contentType = contentType;
            this.size = size;
            this.uploadTime = uploadTime;
        }
        
        // Getters
        public String getFileName() { return fileName; }
        public String getContentType() { return contentType; }
        public long getSize() { return size; }
        public java.time.LocalDateTime getUploadTime() { return uploadTime; }
    }
    
    /**
     * 批量删除结果
     */
    class BatchDeleteResult {
        private int successCount;
        private int failureCount;
        private List<String> failedFiles;
        
        public BatchDeleteResult(int successCount, int failureCount, List<String> failedFiles) {
            this.successCount = successCount;
            this.failureCount = failureCount;
            this.failedFiles = failedFiles;
        }
        
        // Getters
        public int getSuccessCount() { return successCount; }
        public int getFailureCount() { return failureCount; }
        public List<String> getFailedFiles() { return failedFiles; }
    }
}
